// 树的重心：对于树上的每一个点，计算其所有子树中最大的子树节点数，这个值最小的点就是这棵树的重心。
// 树的重心如果不唯一，则至多有两个，且这两个重心相邻。
// 帖子：https://oi-wiki.org/graph/tree-centroid/
// 测试链接：http://poj.org/problem?id=1655

#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 20001;
const int MAXM = MAXN << 1;
// 链式前向星
int head[MAXN];
int to[MAXM];
int next[MAXM];
int cnt = 1;
int sz[MAXN];
int n, t;
int u, v;
int balance;
int centerId[2]; // 用来记录树的重心（存的是节点编号）

inline int read()
{
    char ch = getchar();
    int x = 0, f = 1;
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = 10 * x + ch - '0';
        ch = getchar();
    }
    return f * x;
}

// 链式前向星加边
void addEdge(int u, int v)
{
    ::next[cnt] = head[u];
    to[cnt] = v;
    head[u] = cnt++;
}

// 初始化
void build()
{
    fill(sz + 1, sz + n + 1, 0);
    fill(head + 1, head + n + 1, 0);
    fill(centerId, centerId + 2, 0);
    cnt = 1;
}

void dfs(int u, int fa)
{
    sz[u] = 1;
    int maxPart = 0;  // maxPart 是去掉某个节点后，记录最大连通块的大小
    for(int ei = head[u]; ei; ei = ::next[ei])
    {
        int v = to[ei];
        if(v == fa) continue; // 避免节点的重复访问
        dfs(v, u);
        maxPart = max(maxPart, sz[v]); 
        sz[u] += sz[v]; // 求出 u 这棵子树的大小
    }
    maxPart = max(maxPart, n - sz[u]); // 不属于 u 这块子树的那个连通块的大小
    // 以树的重心为根时，所有子树的大小都不超过整棵树大小的一半
    if(maxPart <= n / 2)
    {
        centerId[centerId[0] != 0] = u;
        balance = maxPart;
    }
}

int main()
{
    t = read();
    while(t--)
    {
        n = read();
        build(); 
        for(int i = 1; i < n; ++i)
        {
            u = read(), v = read();
            // 建无向图
            addEdge(u, v);
            addEdge(v, u);
        }
        dfs(1, 0);
        // 打印重心
        for(int i = 0; i < 2; ++i)
        {
            if(centerId[i] != 0)
            {
                printf("%d %d\n", centerId[i], balance);
            }
        }
    }

    return 0;
}